숫자와 문자열의 다양한 기능 | ✅저자: 이유정(박사)
🔹 format()
함수란?
현업 개발자들은 문자열 안에 변수나 값을 깔끔하게 삽입할 때
format() 함수를 매우 자주 사용합니다. 코드 가독성을 높이고,복잡한
문자열을 쉽게 조합할 수 있도록 해주기 때문입니다.
특히 사용자 입력값이나 변수들을 설명 문장에 포함시킬 때 연산자 대신
format( )을 사용하는 습관을 들이면 코드 관리가 훨씬 쉬워집니다.
항목 | 설명 |
---|---|
기능 | 문자열 안에 값을 깔끔하게 삽입하는 함수입니다. |
사용법 | "문장 안에 {}로 자리 표시" .format(값들) 형태로 사용합니다. |
특징 | .format() 안에 적은 값들이, 왼쪽 문자열에 있는 {} 에 순서대로 들어갑니다. |
현업 용어 ... | "string formatting", "문자열 포맷팅" 이라고 부릅니다. |
</> 예시코드: 기본 사용법 (위치지정방식) |
name = "Eunice"
age = 25
print("이름: {}, 나이: {}".format(name, age))
🖨️ 출력결과:
이름: Eunice, 나이: 25
🔍 해설:
{}
는 값을 넣을 자리 표시자(placeholder)입니다.
.format(name, age)
를 통해 name
과 age
가 각각 첫 번째 {}
, 두 번째 {}
자리에 자동 삽입됩니다.
순서에 따라 변수들이 빈칸에 들어가므로 추가 가공 없이 깔끔한 출력이 가능합니다.
💬 보충설명: 스퀘어브라켓: [ ] 리스트생성, 인덱싱과 슬라이싱, 딕셔너리 키 접근 커리브라켓: { } 딕셔너리 생성, 집합생성, f-string에서 변수 삽입, format() 메서드의 치환 필드지정 등에 사용됩니다. 라운드브라켓: ( ) 함수정의 호출, 튜플(tuple)생성, 연산 우선훈위 지정, 조건문등.
📝 문제1] 숫자 두 개를 문자열로 합쳐 출력하기, 단 format( )사용하기
숫자 5
와 7
을 이용해 "5 + 7 = 12"
형태로 출력하세요.
a = 5
b = 7
print("{ } + { } = { }".format(a, b, a + b))
🖨️ 출력 결과:
5 + 7 = 12
📝 문제2] 문자열과 변수 함께 출력하기 이름이 "지민"이고 나이가 20살일 때, "지민님의 나이는 20살입니다." 를 출력하세요.
name = "지민"
age = 20
print("{ }님의 나이는 { }살입니다.".format(name, age))
📝 문제3] 사용자 입력으로 문장 만들기 사용자에게 과일 이름과 개수를 입력받아 "사과를 3개 샀어요." 처럼 출력하세요.
✅ 정답 코드:
fruit = input("과일 이름: ") # 예: 사과
count = input("개수: ") # 예: 3
print(fruit)
print(count)
print("{}를 {}개 샀어요.".format(fruit, count))
🖨️ 출력 결과:
과일 이름: 사과
개수: 3
사과를 3개 샀어요.
◽ 위치 지정과 키워드 인자 사용:
{0}, {1} 위치 지정: {} 대신 {0}, {1} 처럼 인덱스를 지정할 수 있음
키워드 인자 사용: format(name="홍길동", age=20)처럼 이름을 지정하
여 넣을 수도 있습니다.
</> 예시코드: 위치 지정 예시
name = "지민"
age = 20
print("{1}가 {0}살입니다.".format(20, "Eunice"))
🖨️ 출력 결과:
Eunice가 25살입니다.
</> 예시코드: 키워드 인자 예시
print("{name}님의 나이는 {age}살입니다.".format(name="지민", age=20))
🖨️ 출력 결과:
지민님의 나이는 20살입니다.
◽ IndexError
예외
format( ) 함수를 사용할 때 { } 자리의 개수와 .format( ) 안에
들어가는 값의 개수가 맞지 않으면 IndexError가 발생합니다.
- { } 개수보다 .format( )의 값이 적으면 에러가 발생합니다.
- 즉, 포맷에 들어갈 변수가 부족하거나 초과될 때 발생하는 오류입니다.
현업에서도 자주 발생하는 실수 중 하나로, format( )을 사용하실 때 반드시 자리와 값을 확인하는 습관을 들이시는 것이 좋습니다.
항목 | 설명 |
---|---|
오류 이름 | IndexError |
발생 원인 | {} 자리표시자와 .format() 의 값 개수가 맞지 않을 때 발생 |
해결 방법 | {} 의 개수와 .format() 안의 값 개수를 동일하게 맞추어야 함 |
현업 용어 | "format index error", "자리 표시자 불일치 에러" 등으로 표현함 |
💬 보충설명: |
`IndexError`는 말 그대로 인덱스(순서)에 관련된 오류로,
실제 값보다 요청한 자릿수{ }가 더 많을 때 주로 발생합니다.
</> 예시코드: 기본 오류 발생 예시
print("이름: {}, 나이: {}, 지역: {}".format("유정", 25))
# ❌ 지역 값이 빠졌습니다.
❌ 🖨️ 출력 결과: 에러 메시지:
IndexError: Replacement index 2 out of range for positional args tuple
🔍 해설:
문자열에 {}
가 총 3개 있지만, .format()
에 제공된 값은 2개("유정", 25)뿐이므로 세 번째 {}
에 들어갈 값이 없습니다.
이로 인해 IndexError
가 발생한 것입니다.
💬 보충설명:
반대로, {}
보다 .format()
에 제공된 값이 많으면 에러는 나지 않지만,
불필요하게 입력한 값은 무시됩니다. 이것도 현업에서 코드 리뷰 시 주의해야 하는 부분입니다.
🔹 format( ) 함수의 다양한 기능
◽ 정수 출력의 다양한 형태
파이썬의 format()
함수를 사용하면 정수를 다양한 형태로 출력할 수 있습니다. 예를 들어, 다음과 같은 형식을 지정할 수 있습니다:
- 10진수: 기본 정수 출력
- 16진수: 주로 메모리 주소나 색상 코드 등을 표현할 때 사용
- 8진수: 파일 시스템의 퍼미션을 설정할 때 사용할 수 있습니다.
- 2진수: 비트 레벨의 연산을 설명할 때 사용
</> 예시코드:
number = 255
# 10진수 출력
print("basic": {}".format(number))
# 범용 출력(정수, 실수, 문자열 모두 가능)
print("Decimal: {:d}".format(number))
# 정수(10진수)출력 전용
# 16진수 출력
print("Hexadecimal: {:x}".format(number))
# 8진수 출력
print("Octal: {:o}".format(number))
# 2진수 출력
print("Binary: {:b}".format(number))
🖨️ 출력 결과:
Decimal: 255
Decimal: 255
Hexadecimal: ff
Octal: 377
Binary: 11111111
🔍 해설:
위의 코드는 255라는 정수를 10진수, 16진수, 8진수, 2진수로 변환하여 출력합니다. 각 형식 지정자(d
,x
, o
, b
)는 정수를 해당 진법으로 변환하여 문자열로 반환합니다.
💬 보충설명:
format()
함수 안에서 {:d}
,{:x}
, {:o}
, {:b}
같은 걸 형식 지정자(format specifier) 라고합니다. 이건 “출력할 때 어떤 모양으로 보여줄까?” 를 정하는 명령어 같은 기호예요.
❌ TypeError 발생 사례
print("{:d}".format("10")) # 문자열을 넣으면 에러
print("{:d}".format(3.14)) # 실수에 쓰면 에러(정수전용)
◽ 정수 출력의 형식 지정자 정리
형식 지정자 | 의미 | 예시 코드 | 출력 결과 | 해설 |
---|---|---|---|---|
{:d} |
10진수 출력 | {:d} |
255 | 정수 그대로 출력 |
{:b} |
2진수(binary) 출력 | {:b} |
11111111 | 컴퓨터가 이해하는 0과 1 |
{:o} |
8진수(octal) 출력 | {:o} |
377 | 주로 파일 퍼미션 표시 등에 사용 |
{:x} |
16진수(hex) 출력 - 소문자 | {:x} |
ff | 색상코드 등에 사용, 소문자 출력 |
{:X} |
16진수(hex) 출력 - 대문자 | {:X} |
FF | 대문자 버전 (예: 0xFF ) |
{:05d} |
0으로 채워진 5자리 정수 출력 | {:05d} |
00255 | 자릿수 맞추기용, 숫자 앞에 0 채움 |
{:<5d} |
왼쪽 정렬 후 5자리 공간 확보 | {:<5d} |
255xx | 글자 왼쪽 정렬 (오른쪽은 공백) |
{:>5d} |
오른쪽 정렬 후 5자리 공간 확보 | {:>5d} |
xx255 | 글자 오른쪽 정렬 (왼쪽은 공백) |
{:^5d} |
가운데 정렬 후 5자리 공간 확보 | {:^5d} |
x255x | 글자를 가운데 정렬 |
- 숫자 앞뒤로 x는 공백을 의미합니다.
</> 예시코드:
number = 255
print("10진수: {:d}".format(number)) # 일반적인 정수 출력
print("2진수: {:b}".format(number)) # 2진수 출력
print("8진수: {:o}".format(number)) # 8진수 출력
print("16진수(소문자): {:x}".format(number)) # 16진수 (소문자)
print("16진수(대문자): {:X}".format(number)) # 16진수 (대문자)
print("0으로 채우기: {:05d}".format(number)) # 5자리, 앞을 0으로 채움
print("왼쪽 정렬: {:<5d}".format(number)) # 왼쪽 정렬
print("오른쪽 정렬: {:>5d}".format(number)) # 오른쪽 정렬
print("가운데 정렬: {:^5d}".format(number)) # 가운데 정렬
🖨️ 출력 결과:
10진수: 255
2진수: 11111111
8진수: 377
16진수(소문자): ff
16진수(대문자): FF
0으로 채우기: 00255
왼쪽 정렬: 255
오른쪽 정렬: 255
가운데 정렬: 255
◽ 부동 소수점 출력의 다양한 형태
부동 소수점 수는 소수점을 포함하는 실수를 표현할 때 사용됩니다.
format() 함수를 이용하면 소수점 이하의 정밀도를 지정하거나
과학적 표기법을 사용할 수 있습니다.
</> 예시코드:
number = 1234.56789
# 기본형은 소수점 아래 6자리까지 표현
print("default: {:f}".format(number))
# 소수점 아래 두 자리까지 표현
print("Fixed point: {:.2f}".format(number))
# 과학적 표기법
print("Scientific: {:.2e}".format(number))
🖨️ 출력 결과:
default: 1234.567890
Fixed point: 1234.57
Scientific: 1.23e+03
🔍 해설:
위의 코드는 1234.56789라는 부동 소수점 수를 소수점 아래 두 자리로 반올림하거나 과학적 표기법으로 표현합니다. {:.2f}
는 고정 소수점 형식으로 소수점 아래 두 자리까지 표시하고, {:.2e}
는 과학적 표기법으로 표시합니다.
◽ 의미 없는 소수점 제거
부동 소수점 수에서 값이 정수일 때 소수점을 출력하지 않도록 하려면
format() 함수를 사용하여 조건적으로 포맷팅할 수 있습니다.
</> 예시코드:
number = 1234.0
# 소수점 이하가 의미 없을 때 제거
print("No meaningless decimal: {:.0f}".format(number))
🖨️ 출력 결과:
No meaningless decimal: 1234
🔍 해설:
위의 코드에서 {:.0f}
형식 지정자는 소수점 이하를 출력하지 않습니다. 이는 주로 사용자 인터페이스에서 정수값을 깔끔하게 표시하고자 할 때 유용합니다.
🔹 문자열 관련 메서드 총정리
🔹 문자열 조사 및 판별 메서드
문자열이 특정한 형식이나 조건을 만족하는지 판단해주는 도구로,
문자열이 "어떤 종류의 문자들로만 이루어져 있는가?",
또는 "특정한 형태로 시작하거나 끝나는가?"를 참(True) 또는
거짓(False)으로 알려주는 기능이에요.
📘 사용 목적: 입력값이 문자만 있는지, 숫자인지, 대소문자 구성이 맞는지, 공백만 있는지등 조건 검사를 자동으로 해주는 편리한 도구입니다. 사용자 입력을 검증하거나 문자열의 형태를 확인할 때 자주 사용됩니다.
메서드 | 설명 | 예시 |
---|---|---|
isalpha() |
문자로만 구성되었는가 | "abc".isalpha() → True |
isdigit() |
숫자로만 구성되었는가 | "123".isdigit() → True |
isalnum() |
알파벳 또는 숫자로만 구성 | "abc123".isalnum() → True <br>"www".isalnum()→ True` |
islower() |
모두 소문자인가 | "hello".islower() → True |
isupper() |
모두 대문자인가 | "HELLO".isupper() → True |
isspace() |
공백으로만 구성 | " ".isspace() → True |
istitle() |
제목 형식인가 (각 단어 첫 글자 대문자) | "Hello World".istitle() → True |
startswith(substr) |
지정 문자열로 시작하는가 | "hello".startswith("he") → True |
endswith(substr) |
지정 문자열로 끝나는가 | "hello".endswith("lo") → True |
</> 예시코드: |
# isalpha()
print("abc".isalpha()) # True
print("한글".isalpha()) # True
print("abc123".isalpha()) # False
# isdigit()
print("123".isdigit()) # True
print("12a3".isdigit()) # False
# isalnum()
print("abc123".isalnum()) # True
print("www".isalnum()) # True (특수문자 공백 제외하고 True)
print("abc 123".isalnum()) # False (공백 포함)
# islower()
print("hello".islower()) # True
print("Hello".islower()) # False
# isupper()
print("HELLO".isupper()) # True
print("Hello".isupper()) # False
# isspace()
print(" ".isspace()) # True
print(" \t\n ".isspace()) # True
print(" a ".isspace()) # False
# istitle()
print("Hello World".istitle()) # True
print("hello world".istitle()) # False
# startswith()
print("hello".startswith("he")) # True
print("hello".startswith("lo")) # False
# endswith()
print("hello".endswith("lo")) # True
print("hello".endswith("he")) # False
◽ 문자열 조사 및 판별 메서드: 웹 개발, 데이터 처리, 사용자 입력 검증등에 활용되며 사용 예 및 활용 맥락은 다음과 같다:
1️⃣ startswith(substr)
→ 문자열이 특정 문자열로 시작하는지 확인
(URL, 로그 등에서 매우 자주 사용)
2️⃣ endswith(substr)
→ 문자열이 특정 문자열로 끝나는지 확인
(파일 확장자, 로그 포맷 등에서 활용)
3️⃣ isdigit()
→ 숫자만 포함되어 있는지 확인
(나이, 금액 등 사용자 입력 검증 시 자주 사용)
4️⃣ isalnum()
→ 영문자 또는 숫자로만 구성되어 있는지 확인
(아이디, 비밀번호 등 유효성 검사)
5️⃣ isalpha()
→ 영문자 또는 한글만 포함되었는지 확인
(이름 등 검증 시 활용)
6️⃣ isspace()
→ 공백 문자만 포함되어 있는지 확인
(데이터 클렌징, 전처리 시 사용)
7️⃣ islower()
→ 모든 문자가 소문자인지 확인
(텍스트 정규화, NLP 분야에서 사용됨)
8️⃣ isupper()
→ 모든 문자가 대문자인지 확인
(강조 텍스트 필터링 등 일부 경우)
9️⃣ istitle()
→ 문자열이 제목 형식인지 확인
(문장 스타일 체크 시 사용 빈도 낮음)
📖 문법, 구문(syntax):
문자열.startswith(찾을_문자열[, 시작인덱스[, 끝인덱스]])
◽ 매개변수: 찾을_문자열: 문자열이 이 값으로 시작하는지 확인 시작인덱스: (선택) 시작 위치 지정 끝인덱스: (선택) 끝 위치 지정
</>예시코드: 문자열이 특정 접두사로 시작하는지 확인
url = "https://openai.com"
if url.startswith("https://"):
print("보안 연결된 URL입니다.")
else:
print("비보안 URL입니다.")
🖨️ 출력 결과:
보안 연결된 URL입니다.
🔍 해설:
startswith("https://")
는 문자열이"https://"
로 시작하면True
를 반환합니다.- 실제 웹개발에서 URL 유효성 검사 시 자주 사용됩니다.
📖 endswith(substr)
문법, 구문(syntax):
문자열.endswith("확인할_문자열"[, 시작인덱스[, 끝인덱스]])
◽ 매개변수: 확인할_문자열: "문자열" 이 이 값으로 끝나는지 확인합니다 시작인덱스: (선택) 시작 위치 지정 끝인덱스: (선택) 끝 위치 지정
</>예시코드: 이미지 파일 필터링
filename = "holiday_photo.png"
if filename.endswith(".png"):
print("PNG 이미지 파일입니다.")
else:
print("다른 형식의 파일입니다.")
🖨️ 출력 결과:
PNG 이미지 파일입니다.
🔍 해설:
"holiday_photo.png".endswith(".png")
는True
를 반환하므로if
블록이 실행됩니다.endswith()
는 문자열이 특정 확장자로 끝나는지 확인할 때 매우 유용합니다.
📝 문제1] 사용자로부터 입력 받은 문자열이 알파벳으로만 구성되어 있고, 모두 소문자인지 확인하세요.
✨ 힌트:
isalpha()
와 islower()
를 동시에 사용해야 합니다.
사용자가 입력한 문자가 숫자, 공백, 특수문자가 섞이면 False
가 됩니다.
✅ 정답 코드:
text = input("소문자 알파벳만 입력하세요:")
result = text.isalpha() and text.islower()
print("소문자 알파벳으로만 구성됐나요?", result)
🖨️ 출력 결과:
소문자 알파벳으로만 구성됐나요? True
🔍 해설:
isalpha()
는 입력한 문자열이 알파벳(문자)만으로 이루어졌는지 확인합니다.
→ 숫자, 공백, 특수문자가 섞이면False
가 됩니다.islower()
는 입력한 문자열이 모두 소문자인지 확인합니다.
→ 대문자가 하나라도 있으면False
입니다.and
는 두 조건이 모두 True일 때만 True를 반환합니다.
✅ 예: hello
→ True / Hello
→ False / hello123
→ False
📝 문제2] 문자열 "DATA2025!"
이 알파벳 또는 숫자로만 되어 있는지 확인하세요.
✨ 힌트:
isalnum()
은 알파벳 + 숫자 조합이면 True
특수문자(!
, @
, 등)가 섞이면 False
✅ 정답 코드:
text = "DATA2025!"
print("알파벳 또는 숫자로만 구성됐나요?", text.isalnum())
🖨️ 출력 결과:
알파벳 또는 숫자로만 구성됐나요? False
🔍 해설:
isalnum()
는 문자열이 알파벳 또는 숫자만으로 구성됐는지 확인합니다.
→ 공백, 느낌표!
, 기타 특수문자가 들어가면False
가 됩니다."DATA2025!"
에는 느낌표!
가 포함되어 있으므로False
가 출력됩니다.
✅ 예: Data2025
→ True / DATA2025!
→ False
📝 문제3] 사용자로부터 입력 받은 문자열이 공백만으로 구성되어 있는지와 동시에 탭 또는 줄바꿈 문자가 포함되어 있는지를 확인하세요.
✨ 힌트:
isspace()
는 공백, 탭(\t
), 줄바꿈(\n
)을 포함하면 True
"\t\n "
도 True
로 평가됨
✅ 정답 코드:
text = input("공백, 탭, 줄바꿈만 입력하세요: ")
print("공백 문자만 포함됐나요?", text.isspace())
🖨️ 출력 결과:
공백 문자만 포함됐나요? True
🔍 해설:
isspace()
는 문자열이 오로지 공백 문자(스페이스, 탭, 줄바꿈)로만 구성되었는지를 확인합니다.- 공백
" "
- 탭
"\t"
- 줄바꿈
"\n"
이 세 가지가 혼합되어 있어도 True가 됩니다.
- 공백
- 문자나 숫자가 하나라도 섞이면
False
가 됩니다.
✅ 예: " \t\n"
→ True / " \t1"
→ False
📝 문제4] 문자열 " Python3 "
에서 좌우 공백을 제거한 후, 알파벳과 숫자로만 구성되어 있는지 확인하세요.
✨ 힌트:
strip()
으로 공백 제거 후 isalnum()
으로 검사
🖨️ 출력 결과:
알파벳 또는 숫자로만 구성됐나요? True
✅ 정답 코드:
text = " Python3 "
cleaned = text.strip()
print("알파벳 또는 숫자로만 구성됐나요?", cleaned.isalnum())
🔍 해설:
- 문자열 양쪽에 있는 공백
" "
은strip()
을 사용해서 제거합니다. "Python3"
가 되면, 이건 알파벳과 숫자의 조합이므로isalnum()
은 True를 반환합니다.- 만약 공백을 제거하지 않으면
" Python3 "
는 공백이 포함되어 있어서isalnum()
은 False가 됩니다.
✅ 예: " Python3 "
→ True (공백 제거 후)
📝 문제5] 문자열 "Hello World"
를 소문자로 바꾼 후, 완전히 소문자로만 구성되어 있는지 확인하세요.
✨ 힌트:
lower()
로 소문자로 만든 후 islower()
사용
공백은 영향을 주지 않음
✅ 정답 코드:
text = "Hello World"
lowered = text.lower()
print("완전히 소문자인가요?", lowered.islower())
🖨️ 출력 결과:
완전히 소문자인가요? True
🔍 해설:
lower()
는 문자열의 모든 알파벳을 소문자로 바꿉니다.islower()
는 문자열이 소문자로만 구성되어 있는지 확인합니다.- 공백
" "
은 소문자도 대문자도 아니므로 검사에서 제외됩니다.
→ 즉,hello world
처럼 되어 있으면islower()
는 True를 반환합니다.
✅ 예: "Hello World"
→ lower()
후 → "hello world"
→ True
📝 문제6] 사용자 ID 형식 검사하기
# 문제설명
사용자에게 아이디를 입력받아, 다음 조건을 만족하는지 검사하세요:
1. 아이디는 영문 또는 숫자로만 구성되어야 한다.
2. 아이디는 대문자가 포함되면 안 된다.
조건을 만족하면 "사용자 등록 가능"을, 하나라도 어기면 "잘못된 아이디 형식"을 출력하세요.
🌟 힌트:
isalnum()
→ 문자와 숫자로만 되어 있는지 판별
islower()
→ 입력된 모든 문자가 소문자인지 판별
두 조건을 동시에 만족해야 등록 가능
🖨️ 출력 예시:
아이디를 입력하세요: john123
사용자 등록 가능
✅ 정답 코드:
user_id = input("아이디를 입력하세요: ")
if user_id.isalnum() and user_id.islower():
print("사용자 등록 가능")
else:
print("잘못된 아이디 형식")
📝 문제7] 문장 입력 시 제목 형식인지 검사하기
# 문제 설명
사용자에게 문장을 입력받아, 각 단어의 첫 글자가 대문자인 "제목 형식"인지 검사하세요.
- 제목 형식이면: "올바른 제목입니다."
- 아니면: "제목 형식이 아닙니다." 를 출력하세요.
🌟 힌트:
istitle()
은 "The Great Escape"처럼 각 단어의 첫 글자만 대문자이면 True를 반환함
전체 대문자("THE GREAT ESCAPE"
)나 전체 소문자("the great escape"
)는 False가 됨
🖨️ 출력 예시:
제목을 입력하세요: The Great Escape
올바른 제목입니다.
✅ 정답 코드:
title = input("제목을 입력하세요: ")
if title.istitle():
print("올바른 제목입니다.")
else:
print("제목 형식이 아닙니다.")
🔹 문자열 변경 (새 문자열 반환)
문자열의 모양을 바꾸거나, 특정 문자를 교체하거나, 공백이나 형식을
다듬는 데 사용되는 문자열 가공 도구들입니다.
즉, "문자열을 그대로 두지 않고 변형하거나 정리하는 작업을 자동으로
처리"해 줍니다.
메서드 | 설명 | 예시 |
---|---|---|
lower() |
모두 소문자로 | "HELLO".lower() → "hello" |
upper() |
모두 대문자로 | "hello".upper() → "HELLO" |
capitalize() |
첫 글자만 대문자 | "hello world".capitalize() → "Hello world" |
title() |
각 단어 첫 글자 대문자 | "hello world".title() → "Hello World" |
swapcase() |
대소문자 뒤집기 | "Hello".swapcase() → "hELLO" |
strip() |
양쪽 공백 제거 | " hi ".strip() → "hi" |
lstrip() |
왼쪽 공백 제거 | " hi".lstrip() → "hi" |
rstrip() |
오른쪽 공백 제거 | "hi ".rstrip() → "hi" |
replace(a, b) |
문자열 교체 | "apple".replace("p", "b") → "abble" |
zfill(width) |
0으로 채워 고정 길이 만들기 | "42".zfill(5) → "00042" |
</> 예시코드: |
# lower()
print("HELLO".lower()) # hello
# upper()
print("hello".upper()) # HELLO
# capitalize()
print("hello world".capitalize()) # Hello world
# → 문장의 첫 글자만 대문자, 나머지는 소문자
# title()
print("hello world".title()) # Hello World
# → 각 단어의 첫 글자가 대문자
# swapcase()
print("Hello".swapcase()) # hELLO
# → 대소문자 뒤집기 (A ↔ a)
# strip()
print(" hi ".strip()) # hi
# → 앞뒤 공백 모두 제거
# lstrip()
print(" hi".lstrip()) # hi
# 엘스트립
# rstrip()
print("hi ".rstrip()) # hi
# replace("p", "b")
print("apple".replace("p", "b")) # abble
# zfill(5)
print("42".zfill(5)) # 00042
# → 전체 길이를 5로 만들고, 부족한 앞자리에 0을 채움
📝 문제 1] 사용자 입력 정리 및 검증
사용자로부터 이름을 입력받습니다.
다음 조건을 만족하면 "등록 완료", 아니면 "형식 오류"를 출력하세요:
- 이름의 앞뒤 공백을 제거하고(
strip()
) - 모든 문자가 소문자여야 하고(
islower()
) - 길이가 3글자 이상이어야 함
🌟 힌트:
strip()
으로 공백 제거 후 islower()
와 len()
을 사용하세요.
🖨️ 출력 예시:
입력: john
출력: 등록 완료
✅ 정답 코드:
name = input("이름을 입력하세요: ").strip()
if name.islower() and len(name) >= 3:
print("등록 완료")
else:
print("형식 오류")
🔍 해설:
" john "
→ "john"
→ 소문자이며 길이 4 → 조건 통과
📝 문제 2] 비밀번호 포맷 처리
비밀번호는 숫자 문자열로 구성됩니다. 사용자가 "42"
를 입력하면, 길이가 6이 되도록 앞을 0으로 채운 문자열을 출력하세요.
🖨️ 출력 예시:
입력: 42
출력: 000042
✅ 정답 코드:
password = input("숫자 비밀번호를 입력하세요: ")
print(password.zfill(6))
🔍 해설:
"42".zfill(6)
→ "000042"
📝 문제 3] 문장 스타일 변환기
문장 "hello world"
를 아래 형식으로 출력해보세요:
- 각 단어 첫 글자만 대문자 (
title()
) - 대소문자를 반전시킨 형태 (
swapcase()
)
🖨️ 출력 결과:
hELLO wORLD
✅ 정답 코드:
text = "hello world"
step1 = text.title() # "Hello World"
step2 = step1.swapcase() # "hELLO wORLD"
print(step2)
🔍 해설:
title()
→"Hello World"
swapcase()
→"hELLO wORLD"
📝 문제 4] 잘못된 단어 교정
다음 문장 "apple pen pineapple pen"
에서 "pen"
을 "PEN"
으로 교체한 뒤,
전체 문장을 대문자로 출력하세요.
🌟 힌트:
replace()
→"pen" → "PEN"
- 그다음
upper()
로 전체 대문자 처리
🖨️ 출력 결과:
APPLE PEN PINEAPPLE PEN
✅ 정답 코드:
text = "apple pen pineapple pen"
replaced = text.replace("pen", "PEN")
print(replaced.upper())
🔍 해설:
"pen"
→"PEN"
- 이후 전체 대문자 처리:
"APPLE PEN PINEAPPLE PEN"
📝 문제 5] 사용자 메시지 포맷팅 사용자로부터 메시지를 입력받아 다음 조건으로 정리하여 출력하세요:
- 앞뒤 공백 제거 (
strip()
) - 첫 글자만 대문자로 (
capitalize()
) - "badword"가 포함되어 있다면
"****"
로 대체 (replace()
)
🌟 힌트: 순서 중요: 먼저 공백 제거 → 단어 필터링 → 문장 형태 정리
🖨️ 출력 예시:
입력: badword is not allowed
출력: **** is not allowed
✅ 정답 코드:
message = input("메시지를 입력하세요: ").strip()
message = message.replace("badword", "****")
print(message.capitalize())
🔍 해설:
- 공백 제거 후
"badword"
를"****"
로 바꾸고 capitalize()
로 문장 형태로 정리
🔹 문자열 나누기와 결합
문자열을 특정 기준(구분자)으로 잘라서 나누거나, 여러 조각(리스트)을
다시 하나의 문자열로 합치는 기능을 합니다.
메서드 | 설명 | 예시 |
---|---|---|
split() |
공백 기준 나누기 | "a b c".split() → ['a', 'b', 'c'] |
split(',') |
쉼표 기준 나누기 | "a,b,c".split(',') → ['a', 'b', 'c'] |
rsplit() |
오른쪽부터 나누기 | "a b c".rsplit(' ', 1) → ['a b', 'c'] |
partition() |
처음 나오는 구분자 기준으로 분리 (3개 튜플 반환) | "user:pass".partition(":") → ('user', ':', 'pass') |
join(list) |
리스트를 문자열로 결합 | ",".join(['a', 'b']) → "a,b" |
</> 예시코드 |
# split() - 공백 기준 나누기
text1 = "a b c"
print(text1.split())
# 출력: ['a', 'b', 'c']
# 설명: 공백을 기준으로 문자열을 나누면 각각 리스트 항목이 됨
# split(',') - 쉼표 기준 나누기
text2 = "a,b,c"
print(text2.split(','))
# 출력: ['a', 'b', 'c']
# 설명: 쉼표를 기준으로 나누기. 데이터 파일(CSV 등)에 자주 사용됨
# rsplit(' ', 1) - 오른쪽에서 1번만 나누기
text3 = "a b c"
print(text3.rsplit(' ', 1))
# 출력: ['a b', 'c']
# 설명: 오른쪽에서 한 번만 공백을 기준으로 나눠서 두 조각으로 분리
# partition(':') - 가장 먼저 나오는 : 기준으로 3부분 나누기 (튜플)
text4 = "user:pass"
print(text4.partition(":"))
# 출력: ('user', ':', 'pass')
# 설명: 첫 번째 ':' 기준으로 앞, 구분자, 뒤를 튜플로 나눔
# join() - 리스트를 문자열로 결합
list1 = ['a', 'b']
print(",".join(list1))
# 출력: "a,b"
# 설명: 리스트의 요소를 쉼표로 연결하여 하나의 문자열로 만듦
◽ 문자열 나누기와 결합 메서드 활용: 1️⃣ 데이터 분리: 이름, 이메일, 날짜처럼 한 줄에 묶인 데이터를 나눌 때
2️⃣ 파일 처리: CSV 파일 등에서 쉼표로 구분된 항목을 나눌 때
3️⃣ 사용자 입력 분석: 띄어쓰기, 쉼표, 콜론 등으로 입력값을 쪼갤 때
4️⃣ 출력 형식 제어: 리스트나 결과를 문자열로 깔끔하게 합칠 때
📝 문제 1] 공백으로 분리한 후 결합하기
사용자 입력 "one two three"
를 공백 기준으로 나눈 뒤,
리스트로 만든 후 각 단어를 하이픈(-)으로 연결된 문자열로 출력하세요.
🖨️ 출력 결과:
['one', 'two', 'three']
one-two-three
✅ 정답 코드:
text = "one two three"
words = text.split()
result = "-".join(words)
print(words)
print(result)
🔍 해설:
"one two three".split()
→ ['one', 'two', 'three']
'-'.join(...)
으로 하이픈 연결
📝 문제 2] 이메일 아이디와 도메인 분리하기
- 이메일
"user01@gmail.com"
을 데이터를 - 아이디만 출력되도록 하세요.
🖨️ 출력 결과:
user01
✅ 정답 코드:
email = "user01@gmail.com"
id_part = email.partition("@")[0]
print(id_part)
🔍 해설:
partition("@")
→ ('user01', '@', 'gmail.com')
[0]
번째 인덱스가 아이디 부분
split()
은 리스트 [ ]
partition()
은 튜플을 반환합니다. ( )
📝 문제 3] ## 쉼표로 구분된 문자열을 오른쪽에서만 1번 나누기
문자열 "apple,banana,grape"
를 오른쪽 쉼표 기준으로 1번만 나눠서
앞부분과 뒷부분을 리스트로 출력하세요.
🌟 힌트:
rsplit(',', 1)
사용
🖨️ 출력결과:
['apple,banana', 'grape']
✅ 정답 코드:
fruits = "apple,banana,grape"
result = fruits.rsplit(',', 1)
print(result)
🔍 해설:
오른쪽에서 1번만 나눔 → 앞은 "apple,banana"
, 뒤는 "grape"
📝 문제 4] ## 문자열에서 마지막 단어만 추출하기
문자열 "Learn Python Programming"
에서 가장 마지막 단어만 출력하세요.
🌟 힌트:
rsplit(' ', 1)
을 사용해서 뒤에서 나누기
🖨️ 출력 결과:
Programming
✅ 정답 코드:
text = "Learn Python Programming"
last_word = text.rsplit(' ', 1)[1]
print(last_word)
🔍 해설:
rsplit(' ', 1)
→['Learn Python', 'Programming']
[1]
번째가 마지막 단어
📝 문제 5] 리스트를 문자열로 만들고, 다시 리스트로 만들기
리스트 ["red", "green", "blue"]
를 ;
로 연결해 문자열을 만들고,
그 문자열을 다시 리스트로 복원해서 출력하세요.
🌟 힌트:
join()
으로 문자열 만들고,split()
으로 다시 나눔
🖨️ 출력 결과:
red;green;blue
['red', 'green', 'blue']
✅ 정답 코드:
colors = ["red", "green", "blue"]
joined = ";".join(colors)
restored = joined.split(";")
print(joined)
print(restored)
🔍 해설:
join()
→"red;green;blue"
split(";")
→ 원래 리스트로 복원
🔹 문자열 정렬
center(), ljust(), rjust()는 문자열을 지정된 너비(width) 안에서
가운데, 왼쪽, 오른쪽 중 원하는 위치로 정렬시켜주는 메서드입니다.
부족한 공간은 공백(또는 원하는 문자)으로 채워집니다.
즉, 문자열을 지정된 길이 안에서 보기 좋게 정렬하고, 빈 공간을 채워주
는 도구입니다.
메서드 | 설명 | 예시 |
---|---|---|
center(width) |
가운데 정렬 | "hi".center(5) → " hi " |
ljust(width) |
왼쪽 정렬 | "hi".ljust(5) → "hi " |
rjust(width) |
오른쪽 정렬 | "hi".rjust(5) → " hi" |
</> 예시코드: |
# center(width) - 가운데 정렬
text1 = "hi"
print(text1.center(5))
# 출력: " hi "
# 설명: 문자열 'hi'를 너비 5에 맞춰 가운데 정렬 → 앞뒤로 공백이 추가됨
# ljust(width) - 왼쪽 정렬
text2 = "hi"
print(text2.ljust(5))
# 출력: "hi "
# 설명: 문자열 'hi'를 너비 5에 맞춰 왼쪽 정렬 → 오른쪽에 공백이 생김
# rjust(width) - 오른쪽 정렬
text3 = "hi"
print(text3.rjust(5))
# 출력: " hi"
# 설명: 문자열 'hi'를 너비 5에 맞춰 오른쪽 정렬 → 왼쪽에 공백이 생김
◽ 문자열 정렬 메서드 활용 1️⃣ 표 형태의 출력 정렬 : 데이터를 보기 좋게 나열할 때 사용 (예: 이름, 점수, 금액 등 출력 정렬) 2️⃣ 간단한 텍스트 UI 만들기 제목 가운데 정렬, 표 제목 꾸미기 등 3️⃣ 문자열 채우기 작업 숫자/문자 길이를 맞춰 일정한 출력 형식 만들기
📝 문제 1] 제목 가운데 정렬하기
문자열 "Chapter 1"
을 너비 20으로 설정하여 가운데 정렬된 형태로 출력하세요. 단, 빈 공간은 "-"
문자로 채우세요.
🌟 힌트:
center()
는 공백 대신 다른 문자로도 채울 수 있습니다.
text.center(너비, 채울문자)
형태 사용
🖨️ 출력 결과:
-----Chapter 1------
✅ 정답 코드:
title = "Chapter 1"
print(title.center(20, "-"))
🔍 해설:
"Chapter 1"
길이 9 → 총 20자리 중 남는 11칸- 왼쪽에 5개, 오른쪽에 6개
-
로 채워짐
📝 문제 2] 오른쪽 정렬로 금액 정렬하기 다음 금액 리스트에서 각 항목을 오른쪽 정렬하여 아래와 같이 출력되도록 하세요.
3500
200
10000
🌟 힌트:
- 각 숫자를 문자열로 변환한 뒤,
rjust()
로 너비 6~7 정도로 맞추기
✅ 정답 코드:
prices = [3500, 200, 10000]
for price in prices:
print(str(price).rjust(6))
🖨️ 출력 결과:
3500
200
10000
🔍 해설:
- 숫자를 문자열로 바꾼 후
rjust(6)
→ 6자리 안에서 오른쪽 정렬됨
📝 문제 3] 좌우 여백을 포함한 꾸민 메시지 출력
문자열 "Welcome"
을 왼쪽 정렬(ljust()
), 오른쪽 정렬(rjust()
),
가운데 정렬(center()
)로 각각 너비 20에 맞춰 꾸며서 다음과 같이 출력되게 하세요.
Welcome
Welcome
Welcome
🌟 힌트:
- 각 정렬 메서드에 너비 20을 지정하면 됩니다.
- 공백은 기본값으로 자동 채워짐
✅ 정답 코드:
text = "Welcome"
print(text.ljust(20))
print(text.rjust(20))
print(text.center(20))
🖨️ 출력 결과:
Welcome
Welcome
Welcome
🔍 해설:
"Welcome"
은 길이 7 → 나머지 칸을 공백으로 채워 각각 위치에 정렬됨- UI 출력, 표 꾸미기에 자주 사용되는 패턴
🔹 문자열 찾기
문자열 속에서 특정 문자가 어디에 있는지 찾거나, 몇 번 등장했는지를
확인할 수 있는 도구입니다.
즉, 문자열에서 특정 부분 문자열(단어, 문자 등)의 위치나 개수를
알려줍니다.
메서드 | 설명 | 예시 |
---|---|---|
find(substr) |
왼쪽부터 찾고 인덱스 반환 (없으면 -1) | "apple".find("p") → 1 |
rfind(substr) |
오른쪽부터 찾고 인덱스 반환 | "apple".rfind("p") → 2 |
index(substr) |
find() 와 같지만 없으면 오류 |
"apple".index("p") → 1 |
count(substr) |
부분 문자열 개수 | "apple pie".count("p") → 2 |
</> 예시코드: |
# find(substr) - 왼쪽부터 찾아 첫 번째 인덱스 반환, 없으면 -1
text1 = "apple"
result1 = text1.find("p")
print(result1)
# 출력: 1
# 설명: 'p'가 처음 등장한 위치는 인덱스 1 (0부터 시작)
# ❌실패
result1_fail = text1.find("z")
print(result1_fail)
# 출력: -1
# 설명: 'z'는 존재하지 않으므로 -1 반환
# rfind(substr) - 오른쪽부터 찾아 첫 번째 인덱스 반환, 없으면 -1
text2 = "apple"
result2 = text2.rfind("p")
print(result2)
# 출력: 2
# 설명: 오른쪽에서 찾기 때문에 두 번째 'p'(인덱스 2)가 반환됨
# index(substr) - find()와 같지만, 못 찾으면 오류 발생
text3 = "apple"
result3 = text3.index("p")
print(result3)
# 출력: 1
# 설명: 'p'가 처음 등장한 위치는 인덱스 1
# ❌오류
# result3_fail = text3.index("z") # 주석 해제 시 오류 발생!
# print(result3_fail)
# 오류: ValueError: substring not found
# 설명: 'z'는 없기 때문에 예외 발생 → find()와의 차이점
# count(substr) - 특정 문자열이 몇 번 나오는지 개수 세기
text4 = "apple pie"
result4 = text4.count("p")
print(result4)
# 출력: 3
# 설명: 'p'는 "apple pie"에 3번 등장함
text4 = "apple pie"
result4_none = text4.count("z")
print(result4_none)
# 출력: 0
# 설명: 'z'는 등장하지 않음 → 0 반환 (오류 없음)
📝 문제 1] 마지막으로 등장한 문자의 위치 찾기
문자열 "banana banana banana"
에서 마지막으로 등장한 "b"
의 위치를 구하세요.
🌟 힌트:
rfind()
는 오른쪽부터 탐색하여 가장 마지막에 나온 위치를 반환합니다.
✅ 정답 코드:
text = "banana banana banana"
print(text.rfind("b"))
🖨️ 출력 결과:
14
🔍 해설:
"b"
는 세 번 등장하며, 마지막"b"
는"banana"
세 번째에서 시작 → 인덱스 14
📝 문제 2] 특정 단어가 존재하는지 확인하고 처리하기
문자열 "access denied"
에서 "success"
라는 단어가 존재하지 않을 경우,
"단어 없음"
을 출력하고, 있을 경우 해당 인덱스를 출력하세요.
🖨️ 출력 결과:
단어 없음
✅ 정답 코드:
text = "access denied"
index = text.find("success")
if index == -1:
print("단어 없음")
else:
print(index)
🔍 해설:
"success"
는 문자열에 없으므로find()
는 -1을 반환 → 조건문에서 걸러냄
📝 문제 3] 문자열에서 단어의 개수 세기
문자열 "red, green, red, blue, red"
에서 "red"
라는 단어가 몇 번 나오는지 출력하세요.
◽ 보충설명:
count()
는 문자열 안에서 해당 단어가 몇 번 나오는지 알려줍니다.
✅ 정답 코드:
colors = "red, green, red, blue, red"
print(colors.count("red"))
🖨️ 출력 결과:
3
🔍 해설:
"red"
는 총 3번 등장 →count("red")
는 3 반환
🔹 형식 지정
형식 지정 메서드는 문자열 안에 {}를 넣고,
그 자리에 값을 자동으로 채워주는 문자열 기능이에요.
메서드 | 설명 | 예시 |
---|---|---|
format() |
문자열에 변수 삽입 | "{}점입니다".format(100) → "100점입니다" |
format_map(dict) |
딕셔너리를 이용한 포맷 | "{name}".format_map({"name": "Tom"}) → "Tom" |
◽ format_map(dict)함수 |
딕셔너리에서 키에 해당하는 값을 꺼내서, 문자열의 `{}` 자리에 채워주는 포맷팅 함수입니다.
</>예시코드:
info = {"name": "Tom", "age": 25}
result = "이름: {name}, 나이: {age}".format_map(info)
print(result)
🖨️ 출력 결과
이름: Tom, 나이: 25
🔍 해설
{name}
과{age}
는 비어 있는 자리(포맷 문자열)입니다.format_map(info)
는 딕셔너리info
에서 값을 찾아서{name}
→"Tom"
,{age}
→25
로 채워줍니다.- 딕셔너리에 키와 일치하는 항목이 없으면 오류가 발생하므로 주의해야 합니다.
◽ format_map( ) VS format( ) 차이점
format()
은 자유도가 높고 다양한 인자 전달 가능,
format_map()
은 딕셔너리 하나로 빠르게 포맷할 때 유용.
📝 문제 1] 사용자 정보 포맷 출력하기
딕셔너리 user = {"name": "Alice", "job": "Engineer"}
를 이용하여
문장 "이름: {name}, 직업: {job}"
의 {}
부분을 format_map()
으로 채워 출력하세요.
🖨️ 출력 결과:
이름: Alice, 직업: Engineer
✅ 정답 코드:
user = {"name": "Alice", "job": "Engineer"}
sentence = "이름: {name}, 직업: {job}"
print(sentence.format_map(user))
🔍 해설:
format_map()
은user
딕셔너리의 값을 가져와{name}
과{job}
에 각각"Alice"
와"Engineer"
를 채워 넣습니다.
📝 문제 2] 누락된 키에 대한 오류 상황 다루기
딕셔너리 data = {"title": "Python"}
가 주어졌을 때,
문장 "제목: {title}, 작성자: {author}"
를 format_map()
으로 출력하면 어떤 일이 발생할까요? 오류가 발생하는 이유와 함께, 이를 해결하는 방법을 작성하세요.
🌟 힌트:
format_map()
은{}
안의 키가 딕셔너리에 없으면KeyError
를 발생시킵니다.collections.defaultdict
또는dict subclass
를 활용하면 오류 없이 처리할 수 있습니다.
🖨️ 출력 결과:
제목: Python, 작성자: <author 없음>
✅ 정답 코드 (해결 방법 포함):
class SafeDict(dict):
def __missing__(self, key):
return f"<{key} 없음>"
data = {"title": "Python"}
template = "제목: {title}, 작성자: {author}"
print(template.format_map(SafeDict(data)))
🔍 해설:
- 원래는
KeyError: 'author'
가 발생합니다. SafeDict
는 없는 키가 오면<키 없음>
으로 대신 채워주므로 오류 없이 출력됩니다.- 실무에서는 포맷 문자열에 누락 키가 있을 가능성이 있을 때 이렇게 처리합니다.
🔹 인코딩
encode()는 문자열(사람이 읽을 수 있는 글자)을 바이트(컴퓨터가 읽는
숫자 코드)로 바꾸는 작업입니다.
decode()는 바이트 데이터를 다시 문자열로 되돌리는 작업입니다.
메서드 | 설명 | 예시 |
---|---|---|
encode() |
문자열을 바이트로 인코딩 | "한글".encode() → b'\xed\x95\x9c\xea\xb8\x80' |
decode() |
바이트를 문자열로 디코딩 | b'\xed\x95\x9c\xea\xb8\x80'.decode() → "한글" |
</>예시코드:
# 문자열을 바이트로 인코딩 (encode)
text = "한글"
encoded = text.encode()
print(encoded)
# 출력: b'\xed\x95\x9c\xea\xb8\x80'
# 설명:
# - 문자열 "한글"을 컴퓨터가 이해할 수 있는 바이트 형태로 바꿈
# - 앞의 b는 바이트라는 뜻 (binary data)
# - 각 \x코드는 16진수로 표현된 문자 조각
# 바이트를 다시 문자열로 디코딩 (decode)
decoded = encoded.decode()
print(decoded)
# 출력: 한글
# 설명:
# - 위에서 인코딩한 바이트 데이터를 다시 사람이 읽을 수 있는 글자(문자열)로 변환
# - 결과적으로 원래의 문자열과 동일해짐
◽ 인코딩 활용: 1️⃣ 파일 저장/읽기 텍스트를 파일에 저장할 때는 내부적으로 바이트로 인코딩됩니다. 다시 읽을 때는 디코딩하여 사람이 읽을 수 있는 글자로 변환합니다.
2️⃣ 네트워크 통신 웹 서버나 API는 문자 대신 바이트 데이터를 주고받습니다. 데이터를 주고받을 때 인코딩/디코딩이 필수입니다.
3️⃣ 암호화, 해시(Hash) 처리 전 문자열을 암호화하거나 해시할 때도 바이트로 인코딩해야 합니다.
📖 용어설명:
-
암호화(Encryption): 사람이 읽을 수 있는 데이터(평문)를 특정 규칙(알고리즘)에 따라 읽을 수 없게 변환(암호문)했다 다시 복원(decryption)할수 있는것
-
해시 (Hash): 어떤 데이터를 넣으면, 고정된 길이의 고유한 요약 값(지문)을 만들어내는 함수
-
encode()
는 문자열 → 바이트 (보낼 때, 저장할 때) -
decode()
는 바이트 → 문자열 (받을 때, 읽을 때)
</> 예시코드:
"hello" → 해시 → aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d...
◽ 해시는 어디에 사용되나요?
- 비밀번호저장
- 파일 무결성 검사
- 블록체인 구조
- 데이터 위변조 감지
◽ 기본 개념: 메서드 체이닝 (method chaining) "문자열".메서드( ).메서드( ) 처럼 연결해서 쓸수 있는것
단, 앞 메서드의 결과가 다음 메서드를 쓸 수 있는 자료형이어야 합니다.
예: 문자열 메서드끼리는 대부분 가능합니다.
❌ 예시 2: 불가능한 경우 (비문자열 반환)
email = "user01@gmail.com"
# 아래는 오류 발생
# email.partition("@").lower() ❌
# 튜플 반환: ('user01', '@', 'gmail.com')
🔍 이유:
partition("@")
의 반환값은 튜플- 튜플에는
lower()
가 없음 → 에러 발생
◽ 문자열 메서드 체이닝 조합
strip().lower()
→ 공백을 제거하고 소문자로 변환
" Hello ".strip().lower() # 'hello'
strip().upper()
→ 공백 제거 후 대문자로 변환
" Hi ".strip().upper() # 'HI'
strip().capitalize()
→ 공백 제거 후 첫 글자만 대문자로
" hello world ".strip().capitalize() # 'Hello world'
strip().title()
→ 공백 제거 후 각 단어의 첫 글자를 대문자로
" hello world ".strip().title() # 'Hello World'
lower().replace("old", "new")
→ 소문자 변환 후 특정 단어 치환
"HELLO Python".lower().replace("hello", "hi") # 'hi python'
replace().strip()
→ 특정 문자를 제거하고 공백도 제거
"@@test@@".replace("@", "").strip() # 'test'
strip().split(",")
→ 공백 제거 후 쉼표 기준으로 리스트 분할
" apple,banana ".strip().split(",") # ['apple', 'banana']
replace().title()
→ 단어 변경 후 각 단어 첫 글자 대문자
"hello_world".replace("_", " ").title() # 'Hello World'
◽ 문자열 연결 방법 비교
방법 | 설명 | 속도 | 용도 | 예시 |
---|---|---|---|---|
+ 연산자 |
문자열끼리 직접 더함 | 느림 (많은 문자열 처리 시) | 간단한 연결 | "안녕" + "하세요" |
join() 함수 |
리스트나 튜플 안의 여러 문자열을 한 줄로 합침 | 빠름 (많은 문자열 처리 시 최적) | 대량 문자열 연결 | ", ".join(["a", "b", "c"]) |
f-string |
변수와 문자열을 함께 표현 | 빠름 | 포맷팅이 필요한 경우 | f"이름: {name}" |
% 포맷팅 |
옛날 방식 포맷팅 | 느림 | 오래된 코드에서 사용 | "이름: %s" % name |
.format() |
포맷팅 함수 | 보통 | Python 3의 대표 포맷팅 | "이름: {}".format(name) |
1️⃣ +
연산자: 문자열끼리 직접 더함
name = "영희"
greeting = "안녕하세요, " + name + "입니다."
print(greeting)
🖨️ 출력:
안녕하세요, 영희입니다.
2️⃣ join()
함수: 여러개 문자열 데이터가 한개로 합쳐짐
words = ["파이썬", "정말", "재미있다"]
print(" ".join(words))
🖨️ 출력:
파이썬 정말 재미있다
3️⃣ f-string
: 변수와 문자열을 함께 표현
name = "철수"
age = 20
print(f"{name}는 {age}살입니다.")
🖨️ 출력:
철수는 20살입니다.
4️⃣ .format()
방식: {}
를 사용해 문자열에 값을 넣는 방식
template = "이름: {}, 나이: {}"
print(template.format("지영", 22))
🖨️ 출력:
이름: 지영, 나이: 22
5️⃣ %
포맷팅 방식: C 언어에서 유래한 오래된 방식
name = "철수"
age = 25
print("이름: %s, 나이: %d" % (name, age))
🧾 보충설명: 가독성이 떨어지도 느려서 현재 파이썬에서는 덜 권장되는 방식입니다.
🔹 문자열과 in연산자
in 연산자는 어떤 값이 포함되어 있는지 확인할 때 사용하는 연산자입니
다. 문자열에서 in을 사용하면, 특정 문자가 포함되어 있는지 여부를
True 또는 False로 반환합니다.
"a" in "apple" → True
"z" in "apple" → False
</> 예시코드: 문자열 포함 여부 확인
text = "Python is easy!"
print("Python" in text)
print("java" in text)
🖨️ 출력결과:
True
False
🔍 해설:
"Python"
이라는 단어가text
안에 있으므로 →True
"java"
는 없으므로 →False
- ==대소문자를 구분==하므로
"python"
과"Python"
은 다릅니다!
📝 문제1] 문자열 "Hello, Django!"
에 "Django"
가 포함되어 있는지 확인하세요.
msg = "Hello, Django!"
print("Django" in msg)
🖨️ 출력 결과:
True
📝 문제2] 사용자에게 입력받은 문장에 "love"
가 포함되어 있는지 출력해보세요.
🖨️ 출력 결과 (예시 입력: "I love Python"
):
love가 포함되어 있나요? True
✅ 정답 코드:
sentence = input("문장을 입력하세요: ")
print("love가 포함되어 있나요?", "love" in sentence)
🔍 해설:
- 사용자가 입력한 문장 중
"love"
라는 단어가 있으면True
, 없으면False
📝 문제3] 문자열 "DataScience"
에 "data"
가 포함되어 있는지 확인하되,
대소문자 구분 없이 비교하세요.
text = "DataScience"
🖨️ 출력 결과:
data가 포함되어 있나요? True
✅ 정답 코드:
text = "DataScience"
print("data가 포함되어 있나요?", "data" in text.lower())
🔍 해설:
lower()
를 사용해 문자열을 모두 소문자로 통일한 뒤, "data"
가 포함되어 있는지 확인합니다.